package entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import enumeration.TipoTransacaoEnum;

@Entity
public class ParcelaTransacao extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 1082824403447060113L;

    @EmbeddedId
    private ParcelaPK id = new ParcelaPK();

    @Temporal(TemporalType.DATE)
    private Date dataPagamento;

    @Temporal(TemporalType.DATE)
    private Date dataVencimento;

    @Column(columnDefinition = "NUMERIC(12, 2)")
    private BigDecimal valor;

    private boolean quitada;

    private boolean debitoAutomatico;

    private Integer numeroCheque;

    @Transient
    private boolean editando;

    @Transient
    private boolean vencidaENaoPaga;

    @ManyToOne
    private Fatura fatura;

    @ManyToOne
    @JoinColumn(name = "TRANSACAO_ID", nullable = false, insertable = false, updatable = false)
    private Transacao transacao;

    public BigDecimal getValor() {
	return valor;
    }

    public void setValor(BigDecimal valor) {
	this.valor = valor;
    }

    public boolean isQuitada() {
	return quitada;
    }

    public void setQuitada(boolean quitada) {
	this.quitada = quitada;
    }

    public Fatura getFatura() {
	return fatura;
    }

    public void setFatura(Fatura fatura) {
	this.fatura = fatura;
    }

    public boolean isEditando() {
	return editando;
    }

    public void setEditando(boolean editando) {
	this.editando = editando;
    }

    public Transacao getTransacao() {
	return transacao;
    }

    public void setTransacao(Transacao transacao) {
	this.transacao = transacao;
    }

    public Integer getNumero() {
	return id.getNumero();
    }

    public void setNumero(Integer numero) {
	id.setNumero(numero);
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = super.hashCode();
	result = prime * result + ((id == null) ? 0 : id.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (!super.equals(obj))
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	ParcelaTransacao other = (ParcelaTransacao) obj;
	if (id == null) {
	    if (other.id != null)
		return false;
	} else if (!id.equals(other.id))
	    return false;
	return true;
    }

    public Date getDataPagamento() {
	return dataPagamento;
    }

    public void setDataPagamento(Date dataPagamento) {
	this.dataPagamento = dataPagamento;
    }

    public boolean isDebitoAutomatico() {
	return debitoAutomatico;
    }

    public void setDebitoAutomatico(boolean debitoAutomatico) {
	this.debitoAutomatico = debitoAutomatico;
    }

    public Date getDataVencimento() {
	return dataVencimento;
    }

    public void setDataVencimento(Date dataVencimento) {
	this.dataVencimento = dataVencimento;
    }

    public Integer getNumeroCheque() {
	return numeroCheque;
    }

    public void setNumeroCheque(Integer numeroCheque) {
	this.numeroCheque = numeroCheque;
    }

    public boolean isVencidaENaoPaga() {
	return vencidaENaoPaga;
    }

    public void setVencidaENaoPaga(boolean vencidaENaoPaga) {
	this.vencidaENaoPaga = vencidaENaoPaga;
    }

    public ParcelaPK getId() {
	return id;
    }

    public void setId(ParcelaPK id) {
	this.id = id;
    }

    @Transient
    public boolean getParcelaNegativaVencida() {
	return getParcelaNegativa() && vencidaENaoPaga;
    }

    @Transient
    public boolean getParcelaNegativa() {
	return getTransacao().getTipoTransacao().equals(
		TipoTransacaoEnum.DESPESA)
		|| (getTransacao().getTipoTransacao().equals(
			TipoTransacaoEnum.TRANSFERENCIA) && getTransacao()
			.isEhDestino() == false);
    }

    @Transient
    public boolean getParcelaPositiva() {
	return getTransacao().getTipoTransacao().equals(
		TipoTransacaoEnum.RECEITA)
		|| (getTransacao().getTipoTransacao().equals(
			TipoTransacaoEnum.TRANSFERENCIA) && getTransacao()
			.isEhDestino());
    }

    @Transient
    public boolean getParcelaPositivaVencida() {
	return getParcelaPositiva() && vencidaENaoPaga;
    }
}
